/****************************************Copyright (c)**********************************************
**                               		襄阳润天航空科技电子有限公司
**
**--------------File Info---------------------------------------------------------------------------
* 文 件 名 : SPI驱动头文件
* 作    者 : 李海洋
* 版    本 ：v1.0
* 完成时间 : 2015年1月31日
* 描    述 ：该驱动只支持软件片选且在外部使能片选信号. 使用步骤:
*			1#使用该驱动时应在Includes.h中包含该头文件, 且位于配置定义或Config.h头文件之后!
*			  需要在配置头文件或配置定义定义以下配置宏定义
*			  #define USE_SPI_NUM		1	//定义使用SPI数量
*			  #define NO_USE_FREE_RTOS	//如果不使用操作系统需要明确给出定义
*			2#在c文档中定义SPI驱动对象的结构指针
*			  sSPI_DRIVER *pXXX;
*			3#调用SPI_Init给pXXX赋值
*			  SPI_Init(&pXXX, &spi_handle, CpltSemHandle);
*			4#使能片选信号然后根据需要分别调用以下3个方法. 这些方法属于同步调用
*			  SPI_Only_Tx, SPI_Only_Rx, SPI_Tx_Rx
**--------------------------------------------------------------------------------------------------
* 修 改 人 ：
* 版    本 ：
* 修改时间 : 年月日
* 修改内容 : 
****************************************************************************************************
*/
#ifndef	_SPI_DRIVER_H
#define	_SPI_DRIVER_H

#include "Includes.h"

//=============SPI配置项===============需要修改配置的量
#ifndef USE_SPI_NUM
#define USE_SPI_NUM		1
#endif // !USE_SPI_NUM

/*
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
*											类型定义区		TYPES
typedef ...;
typedef struct {.;.;.;}sXXX;
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
*/
typedef struct {
	SPI_HandleTypeDef		*phspi;		/*指向SPI句柄*/
	#ifndef	NO_USE_FREE_RTOS
	osSemaphoreId			DoneSemId;	/*SPI通讯完成信号量句柄或ID号*/
	#else
	volatile unsigned char	DoneFlag;	/*SPI通讯完成标志*/
	#endif
}sSPI_DRIVER;
/*
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
*											公有变量申明区     public VARIABLES
extern ...;
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
*/
/*  
##########################################################################################
*											     公有函数原型		public FUNCTION PROTOTYPES
extern ...;		也可省略关键字extern
#define	...		宏函数
##########################################################################################
*/
#ifndef	NO_USE_FREE_RTOS
/*
********************************************************************************
*描    述 : 注册SPI驱动变量并初始化
*返    回 : 0:成功；1--重复初始化已经注册过了；-1--spi_drive变量已经用完，需调整USE_SPI_NUM数据。
********************************************************************************/
int SPI_Init(sSPI_DRIVER **pDriver/*[O]指向指向SPI驱动结构的指针*/,
			 SPI_HandleTypeDef *hspi/*[I]指向SPI句柄*/,
			 osSemaphoreId DoneSemId/*[I]SPI通讯完成信号量句柄或ID号*/);
#else
int SPI_Init(sSPI_DRIVER	**pDriver,				/*[O]指向指向SPI驱动结构的指针*/
			 SPI_HandleTypeDef	*hspi);				/*[I]指向SPI句柄*/
#endif
/*
********************************************************************************
*描    述 : SPI在只发送模式下发送数据
*返    回 : 0=成功，-1=访问HAL出错，其它=hspi1.ErrorCode
********************************************************************************/
int SPI_Only_Tx(sSPI_DRIVER *pDriver/*[IN]指向SPI驱动结构*/,
	unsigned char *pDat/*[IN]指向要发送的数据存放处*/,
	unsigned short size/*[IN]发送数据字节个数*/);			
/*
********************************************************************************
*描    述 : SPI在只接收模式下接收数据
*返    回 : 0=成功，-1=访问HAL出错，其它=hspi1.ErrorCode
********************************************************************************/
int SPI_Only_Rx(sSPI_DRIVER *pDriver/*[IN]指向SPI驱动结构*/,
	unsigned char *pDat/*[OUT]指向接收的数据存放处*/,
	unsigned short size/*[IN]接收数据字节个数*/);
/*
********************************************************************************
*描    述 : 同时发送和接收(读写)SPI外设数据
*返    回 : 0=成功，-1=访问HAL出错，其它=hspi1.ErrorCode
********************************************************************************/
int SPI_Tx_Rx(sSPI_DRIVER *pDriver/*[IN]指向SPI驱动结构*/,	
	unsigned char *pRxBuf/*[OUT]指向接收数据存放位置*/,	
	unsigned char *pTxBuf/*[IN]指向发送数据存放位置*/,	
	unsigned short size/*[IN]传输字节数*/);		
/*
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
															结束
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
*/
#endif
